#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2011 OpenWrt.org

START=65
STOP=65

USE_PROCD=1
PROG=/sbin/ntpd
HOTPLUG_HELPER=/usr/sbin/ntpd.hotplug-helper

config_file=/var/etc/ntpd.conf

trunc() {
	echo -n "" > $config_file
}

emit() {
	echo -e "$@" >> $config_file
}

validate_ntp_section() {
	uci_load_validate system timeserver "$1" "$2" \
		'server:list(host)' 'enabled:bool:1' 'enable_server:bool:0' \
		'interface:list(string)'
}

start_ntpd_instance() {
	local intf i

	[ "$2" = 0 ] || {
		echo "validation failed"
		return 1
	}

	[ "$enabled" = 0 ] && return

	[ -z "$server" -a "$enable_server" = 0 ] && return

	# not sure that the interfaces enumerated should be validated,
	# since some of them might be dynamic interfaces (like IPsec
	# tunnels) which aren't known by ubus.

	mkdir -p "$(dirname "$config_file")"

	trunc
	emit "driftfile /var/lib/ntp/ntp.drift\n"

	if [ "$enable_server" != 0 ]; then
		emit "restrict default limited kod nomodify notrap nopeer"
		emit "restrict -6 default limited kod nomodify notrap nopeer"
	else
		emit "restrict -4 default noserve"
		emit "restrict -6 default noserve"
	fi
	emit "restrict source noquery"

	emit "\n# No limits for local monitoring"
	emit "restrict 127.0.0.1"
	emit "restrict -6 ::1\n"

	if [ -n "$interface" ]; then
		local loopback=$(ubus call network.interface dump | jsonfilter -e "@.interface[@.interface='loopback']['device']")

		local saw_lo=
		for intf in $interface; do
			emit "interface listen $intf"
			[ "$intf" = "$loopback" ] && saw_lo=1
		done
		[ -z "$saw_lo" ] && emit "interface listen $loopback"
		emit ""
	fi

	for i in $server
	do
		emit "server $i iburst"
	done

	if [ -d "/etc/ntpd.d" ]; then
		local entry
		for entry in "/etc/ntpd.d"/*.conf; do
			emit "includefile ${entry}\n"
		done
	fi

	if [ -d "/tmp/ntpd.d" ]; then
		local entry
		for entry in "/tmp/ntpd.d"/*.conf; do
			emit "includefile ${entry}\n"
		done
	fi

	mkdir -p /var/lib/ntp
	chown -R ntp:ntp /var/lib/ntp

	procd_open_instance
	procd_set_param command $PROG -g -u ntp:ntp -p /var/run/ntpd.pid -n \
		-c $config_file
	procd_close_instance

	procd_open_instance
	procd_set_param command $HOTPLUG_HELPER
	procd_close_instance
}

start_service() {
	validate_ntp_section ntp start_ntpd_instance
}

service_triggers() {
	procd_add_reload_trigger "system"
	procd_add_validation validate_ntp_section
}
